#include "stdlib.h"
#include "ohos_init.h" // 用于初始化服务(services)和功能(features)
#include "cmsis_os2.h" // CMSIS-RTOS API V2

// lwIP：A Lightweight TCPIP stack
// 瑞典计算机科学院(SICS)的Adam Dunkels开发的一个小型(轻量)开源的TCP/IP协议栈
// 实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用
// 仅占用几十KB RAM空间，40KB ROM空间，非常适合在嵌入式系统中使用
//
// lwIP TCP/IP协议栈：网络接口API
// netifapi：Network Interfaces API
#include "lwip/netifapi.h"

#include "soc_osal.h"
#include "errcode.h"
#include "wifi_hotspot.h"
#include "wifi_hotspot_config.h"
#include "wifi_linked_info.h"
#include "wifi_device_config.h"

#define WIFI_IFNAME_MAX_SIZE 16

errcode_t StartHotspot(char *ssid, char *pre_shared_key, wifi_security_enum security_type, uint8_t channel_num)
{
    /* WiFi SoftAP 网络设备名，SDK默认是ap0, 以实际名称为准 */
    char ifname[WIFI_IFNAME_MAX_SIZE] = "ap0";

    // 设置IP地址、子网掩码、网关地址
    ip4_addr_t st_ipaddr = {0};
    ip4_addr_t st_netmask = {0};
    ip4_addr_t st_gw = {0};
    IP4_ADDR(&st_ipaddr, 192, 168, 63, 1);   /* IP地址设置：192.168.63.1 */
    IP4_ADDR(&st_netmask, 255, 255, 255, 0); /* 子网掩码设置：255.255.255.0 */
    IP4_ADDR(&st_gw, 192, 168, 63, 2);       /* 网关地址设置：192.168.63.2 */

    // Hotspot的配置
    softap_config_stru hapd_conf = {0};
    memcpy_s(hapd_conf.ssid, sizeof(hapd_conf.ssid), ssid, strlen(ssid));                   /* SSID */
    memcpy_s(hapd_conf.pre_shared_key, WIFI_MAX_KEY_LEN, pre_shared_key, WIFI_MAX_KEY_LEN); /* 密码 */
    hapd_conf.security_type = security_type;                                                // WiFi安全类型
    hapd_conf.channel_num = channel_num;                                                    /* 工作信道 */

    // 启动Hotspot
    printf("Hotspot try enable.\r\n");
    while (wifi_softap_enable(&hapd_conf) != ERRCODE_SUCC)
    {
        printf("Hotspot enable fail, retry...\r\n");
        osal_msleep(100);
    }

    /* 配置DHCP服务器 */
    struct netif *netif_p = NULL;
    netif_p = netif_find(ifname);
    if (netif_p == NULL)
    {
        printf("find netif fail.\r\n", ifname);
        wifi_softap_disable();
        return ERRCODE_FAIL;
    }
    if (netifapi_netif_set_addr(netif_p, &st_ipaddr, &st_netmask, &st_gw) != ERR_OK)
    {
        printf("set addr fail.\r\n");
        wifi_softap_disable();
        return ERRCODE_FAIL;
    }
    if (netifapi_dhcps_start(netif_p, NULL, 0) != ERR_OK)
    {
        printf("dhcps start fail.\r\n");
        wifi_softap_disable();
        return ERRCODE_FAIL;
    }

    printf("Hotspot start success.\r\n");
    return ERRCODE_SUCC;
}
